package com.atlas.micro.trafico;

import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.ImageItem;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;

/**
 * <p>Title: TraficoMadrid</p>
 *
 * <p>Description: Programa j2me para ver las cámaras de Tráfico</p>
 *
 * @author Antonio García Rodríguez
 */
public class TraficoMovilApp extends MIDlet implements CommandListener, Constants{

    /**
     * Instancia de la aplicación (singelton)
     */
    static TraficoMovilApp instance = null;

    /**
     * Gestor de las cámaras de trafico, donde reside la lógica de comunicación con los servidores de imágenes
     */
    private TraficoMovilManager traficoMovilManager = null;
    
    /*
     * disclaimer
     */
    private Form disclaimerForm = null;;
    
    private List waitList = null;
    
    /*
     * disclaimer
     */
    private Alert errorScreen =null;
    
    /**
     * Pantalla principal de la aplicación, donde aparece el listado de cámaras.
     */
    private TraficoMovilPrincipalDisp traficoMovilPrincipalDisp = null;

    /**
     * Pantalla para presentar las imagenes de las camaras y la splash-screen
     */
    private ImageScreenCanvas imageScreen = null;

    /**
     * pantalla del búscador de cámaras
     */
    private TextBox searcher = null;
    
    /**
     * Indica si se ha mostrado el disclaimer al usuario (o si ha marcado no volver a verlo)
     */
    private boolean disclaimerMostrado = false;
    /**
     * Indica si la aplicación ha cargado el listado de cámaras disponibles
     */
    private boolean camarasCargadas = false;
    
    /**
     * Constructor por defecto
     */
    public TraficoMovilApp() {
        //instancia para el patrón singlelton
        instance = this;                
        //Gestor de cámaras
        traficoMovilManager = new TraficoMovilManager();
        //Pantalla menú
        traficoMovilPrincipalDisp  = null;        
    }

    /**
     * Inicialización de la aplicación
     */
    public void startApp() {
     //Mostramos la splash Screen
     
        if(false){
            showDisclaimer();
        }else{
            //Hacemos visible la pantalla inicial
             showImageScreen();
        }
    }


    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

    public static void quitApp() {
        instance.destroyApp(true);
        instance.notifyDestroyed();
        instance = null;
    }

    /**
     * principal
     */
    public void showTraficoMovilPrincipal() {

        if (traficoMovilPrincipalDisp == null) {
            traficoMovilPrincipalDisp = new TraficoMovilPrincipalDisp();

            traficoMovilPrincipalDisp.setCommandListener(this);
            traficoMovilPrincipalDisp.addCommand(new Command(LABEL_BUSCAR_CAMARA, Command.ITEM, 1));
            traficoMovilPrincipalDisp.addCommand(new Command(LABEL_VER_CAMARA, Command.ITEM, 1));
            traficoMovilPrincipalDisp.addCommand(new Command(LABEL_VER_TODAS_CAMARAS, Command.ITEM, 1));
            traficoMovilPrincipalDisp.addCommand(new Command(LABEL_ACERCA_DE, Command.ITEM, 1));
            traficoMovilPrincipalDisp.addCommand(new Command(LABEL_SALIR, Command.EXIT, 2));

        }
        //Comprobar que se ha mostrado el disclaimer de consumo de datos
        if(disclaimerMostrado==false){
              disclaimerMostrado =true;
              showDisclaimer();
        }else{
              if(camarasCargadas==false){
                  camarasCargadas = true;
                  cargarCamaras();
              }else{
                  actualizarTicker();
                  Display.getDisplay(TraficoMovilApp.instance).setCurrent(traficoMovilPrincipalDisp);
              }
              
              
        }
    }

    /**
     * muestra imagen en ImageScreenCanvas
     *
     * @param image Image
     */
    public void showImagen(Image image) {
        imageScreen.setImage( image);
        imageScreen.repaint();
        Display.getDisplay(this).setCurrent(imageScreen);
    }

    /**
     * Solicitamos la cámara seleccionada y la pintamos.
     * @param indiceCamara int
     */
    protected void showCamara(int indiceCamara) {
        if(traficoMovilManager.camarasDisponibles()){
            imageScreen.setFullScreenMode(traficoMovilManager.isPantallaCompleta());
            imageScreen.setImage( null);

            imageScreen.setMensaje("Cargando Imagen");
            Display.getDisplay(this).setCurrent(imageScreen);
            new ThreadCargaImagen(indiceCamara).start();
        }
    
    }
    protected void actualizarTicker(){
                        traficoMovilPrincipalDisp.getTicker().setString(String.valueOf(traficoMovilManager.getReadedBytes()/1024) +"kb leidos aprox" );
    }
    private void cargarCamaras() {
        showWait();
        new Thread() {
            public void run() {
                traficoMovilPrincipalDisp.setCamaras(traficoMovilManager.obtenerNombreCamaras());
                actualizarTicker();
                Display.getDisplay(TraficoMovilApp.instance).setCurrent(traficoMovilPrincipalDisp);
            }
        }.start();
    }

    private void showErrorScreen(String error) {
        
        if(errorScreen==null){
            errorScreen = new Alert("Error", error, null, AlertType.ERROR);
            errorScreen.addCommand(new Command(LABEL_ACEPTAR, Command.OK, 1));
            errorScreen.addCommand(new Command(LABEL_SALIR, Command.EXIT, 2));
            errorScreen.setCommandListener(this);
            
        }
        Display.getDisplay(this).setCurrent(errorScreen, Display.getDisplay(this).getCurrent());
    }

    private void showSearcher(){
        if(searcher==null){
            searcher = new TextBox("Buscador", null, 25, TextField.ANY|TextField.INITIAL_CAPS_SENTENCE);
            searcher.addCommand(new Command(LABEL_BUSCAR, Command.OK, 1));
            searcher.addCommand(new Command(LABEL_CANCELAR, Command.CANCEL, 1));
            searcher.setCommandListener(this);
        }
        Display.getDisplay(this).setCurrent(searcher);
    }
   
    private void showDisclaimer() {
        if(disclaimerForm==null){
     
        disclaimerForm = new  DisclaimerForm();
        disclaimerForm.addCommand(new Command(LABEL_ACEPTAR, Command.OK, 1));
            disclaimerForm.addCommand(new Command(LABEL_SALIR, Command.EXIT, 2));
            disclaimerForm.setCommandListener(this);
            
        }
        Display.getDisplay(this).setCurrent(disclaimerForm);
        /*
        if(disclaimerForm==null){
            disclaimerForm = new TextBox("Advertencia", "Tr\u00E1fico Madrid es un piloto que permite visualizar las c\u00E1maras de tr\u00E1fico del Ayuntamiento de Madrid (servicio provisto a trav\u00E9s de http://www.traficomadrid.com.\n\nEste programa hace uso de la red de datos (GPRS/3G) de tu operador. Antes de empezar a utilizarlo debes conocer sus tarifas.\n\nInformaci\u00F3n adicional en http://www.divanbinario.com/trafico_madrid", 400, (int) (TextField.ANY| TextField.UNEDITABLE));           
            disclaimerForm.addCommand(new Command("Ok", Command.OK, 1));
            disclaimerForm.addCommand(new Command("Exit", Command.EXIT, 2));
            disclaimerForm.getCaretPosition();
            disclaimerForm.setCommandListener(this);
        }
        Display.getDisplay(this).setCurrent(disclaimerForm);*/
    }
    
    private void showImageScreen() {

        imageScreen = new ImageScreenCanvas();
        //Habilitamos la pantalla completa
        imageScreen.setFullScreenMode(true);
        //Hacemos visible la pantalla inicial
        Display.getDisplay(this).setCurrent(imageScreen);
    }

    private void showWait() { 
        if(waitList==null){
           waitList = new List("Tráfico Móvil", List.IMPLICIT, new String[]{"(cargando cámaras)"}, null);
        }
        waitList.setCommandListener(this);
        waitList.addCommand(new Command(LABEL_SALIR, Command.EXIT, 2));
        Display.getDisplay(this).setCurrent(waitList);
        
    }
        
    protected class ThreadCargaImagen extends Thread{
        public int camara =0;
        public ThreadCargaImagen(int camara){
           this.camara = camara;
        } 
        public void run(){
            Image image = traficoMovilManager.getCamara(camara);
            showImagen(image);               
         }
    }

    public void commandAction(Command command, Displayable disp) {
        if (command.getCommandType() == Command.EXIT) {
            // stop the MIDlet
            TraficoMovilApp.quitApp();
            return;
        }
        if(command.getLabel().equals(LABEL_ACERCA_DE)){
            showDisclaimer();
        }else        
        //Acciones sobre el disclaimer
        if(disclaimerForm !=null && disp == disclaimerForm){
            if(command.getCommandType() == Command.OK){
                            showTraficoMovilPrincipal();
            }
        }else //Acciones sobre la pantalla de menú de camáras
        if(disp instanceof TraficoMovilPrincipalDisp){
                //Ver cámara
                if(command.getCommandType() == Command.SCREEN ||( command.getCommandType() == Command.ITEM && command.getLabel().equals(LABEL_VER_CAMARA))) {
                    showCamara(traficoMovilPrincipalDisp.getSelectedIndex());
                }else if(command.getCommandType() == Command.ITEM && command.getLabel().equals(LABEL_BUSCAR_CAMARA)) {
                    showSearcher();
                }else if(command.getCommandType() == Command.ITEM && command.getLabel().equals(LABEL_VER_TODAS_CAMARAS)) {
                      traficoMovilManager.filtrarCamaras(null);
                      traficoMovilPrincipalDisp.setCamaras(traficoMovilManager.obtenerNombreCamaras());
                }
                               
        }else
        if(disp == searcher){
            if(command.getCommandType() == Command.SCREEN || command.getCommandType() == Command.OK && command.getLabel().equals(LABEL_BUSCAR )) {
                //Si devuelve true es que hay elementos.
                if(traficoMovilManager.filtrarCamaras(searcher.getString())){
                  traficoMovilPrincipalDisp.setCamaras(traficoMovilManager.obtenerNombreCamaras());
                }else{
                  showErrorScreen(LABEL_ERROR_BUSCADOR);
                  return;
                }
            }
            showTraficoMovilPrincipal();
        }else
        if(disp == errorScreen){
            if(((Alert)disp).getString().equals(LABEL_ERROR_BUSCADOR)){
                showSearcher();
            }
        }
    }
}
